home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 400_01 / socketpp-1.5 / sockinet.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-06  |  6.4 KB  |  295 lines

  1. // sockinet.C  -*- C++ -*- socket library
  2. // Copyright (C) 1992,1993 Gnanasekaran Swaminathan <gs4t@virginia.edu>
  3. // 
  4. // Permission is granted to use at your own risk and distribute this software
  5. // in source and binary forms provided the above copyright
  6. // notice and this paragraph are preserved on all copies.
  7. // This software is provided "as is" with no express or implied warranty.
  8. //
  9. // Version: 31Jan93 1.3
  10.  
  11. #include <sockinet.h>
  12. #include <netdb.h>
  13. #include <builtin.h>
  14.  
  15. extern "C" {
  16.     int    socket(int domain, int type, int proto);
  17.     int    getsockname(int sock, void* addr, int* addrlen);
  18.     int    getpeername(int sock, void* addr, int* addrlen);
  19.     int    gethostname(char* hostname, int len);
  20.     unsigned long inet_addr(const char* hostname); 
  21. }
  22. void    herror(const char*);
  23.  
  24. sockinetaddr::sockinetaddr () 
  25. {
  26.     sin_family    = sockinetbuf::af_inet;
  27.     sin_addr.s_addr = htonl(INADDR_ANY);
  28.     sin_port    = 0;
  29. }
  30.  
  31. sockinetaddr::sockinetaddr(unsigned long addr, int port_no)
  32. // addr and port_no are in host byte order
  33. {
  34.     sin_family      = sockinetbuf::af_inet;
  35.     sin_addr.s_addr = htonl(addr);
  36.     sin_port    = htons(port_no);
  37. }
  38.  
  39. sockinetaddr::sockinetaddr(unsigned long addr, const char* sn, const char* pn)
  40. // addr is in host byte order
  41. {
  42.     sin_family      = sockinetbuf::af_inet;
  43.         sin_addr.s_addr = htonl (addr); // Added by cgay@cs.uoregon.edu May 29, 1993
  44.     setport(sn, pn);
  45. }
  46.  
  47. sockinetaddr::sockinetaddr (const char* host_name, int port_no)
  48. // port_no is in host byte order
  49. {
  50.     setaddr(host_name);
  51.     sin_port = htons(port_no);
  52. }
  53.  
  54. sockinetaddr::sockinetaddr(const char* hn, const char* sn, const char* pn)
  55. {
  56.     setaddr(hn);
  57.     setport(sn, pn);
  58. }
  59.  
  60. void sockinetaddr::setport(const char* sn, const char* pn)
  61. {
  62.     servent* sp = getservbyname(sn, pn);
  63.     if (sp == 0) {
  64.         perror(sn);
  65.         error ("sockinetaddr: invalid service name");
  66.         exit(1);
  67.     }
  68.     sin_port = sp->s_port;
  69. }
  70.  
  71. void sockinetaddr::setaddr(const char* host_name)
  72. {
  73.     if ( (sin_addr.s_addr = inet_addr(host_name)) == -1) {
  74.         hostent* hp = gethostbyname(host_name);
  75.         if (hp == 0) {
  76.             herror("sockinetaddr::sockinetaddr");
  77.             exit(1);
  78.         }
  79.         memcpy(&sin_addr, hp->h_addr, hp->h_length);
  80.         sin_family = hp->h_addrtype;
  81.     }else
  82.         sin_family = sockinetbuf::af_inet;
  83. }
  84.     
  85. const char* sockinetaddr::gethostname () const
  86. {
  87.     if (sin_addr.s_addr == htonl(INADDR_ANY)) {
  88.         static char hostname[64];
  89.         if (::gethostname(hostname, 63) == -1) {
  90.             perror("in sockinetaddr::gethostname");
  91.             return "";
  92.         }
  93.         return hostname;        
  94.     }
  95.     
  96.     hostent* hp = gethostbyaddr(&sin_addr, sizeof(sin_addr), family());
  97.     if (hp == 0) {
  98.         herror("sockinetaddr::gethostname");
  99.         return "";
  100.     }
  101.     if (hp->h_name) return hp->h_name;
  102.     return "";
  103. }
  104.  
  105. sockinetbuf::sockinetbuf(sockbuf::type ty, int proto=0)
  106. : sockbuf(af_inet, ty, proto)
  107. {}
  108.  
  109. sockinetbuf& sockinetbuf::operator = (sockbuf& si)
  110. {
  111.     this->sockbuf::operator = (si);
  112.     return *this;
  113.     
  114. }
  115.  
  116. sockbuf* sockinetbuf::open(sockbuf::type st, int proto)
  117. {
  118.     *this = sockinetbuf(st, proto);
  119.     return this;
  120. }
  121.  
  122. sockinetaddr sockinetbuf::localaddr() const
  123. {
  124.     sockinetaddr sin;
  125.     int len = sin.size();
  126.     if (::getsockname(rep->sock, sin, &len) == -1) {
  127.         perror("sockinetbuf::localaddr()");
  128.     }
  129.     return sin;
  130. }
  131.  
  132. int sockinetbuf::localport() const
  133. {
  134.     sockinetaddr sin = localaddr();
  135.     if (sin.family() != af_inet) return -1;
  136.     return sin.getport();
  137. }
  138.  
  139. const char* sockinetbuf::localhost() const
  140. {
  141.     sockinetaddr sin = localaddr();
  142.     if (sin.family() != af_inet) return "";
  143.     return sin.gethostname();
  144. }
  145.  
  146.  
  147. sockinetaddr sockinetbuf::peeraddr() const
  148. {
  149.     sockinetaddr sin;
  150.     int len = sin.size();
  151.     if (::getpeername(rep->sock, sin, &len) == -1) {
  152.         perror("sockinetbuf::peeraddr()");
  153.     }
  154.     return sin;
  155. }
  156.  
  157. int sockinetbuf::peerport() const
  158. {
  159.     sockinetaddr sin = peeraddr();
  160.     if (sin.family() != af_inet) return -1;
  161.     return sin.getport();
  162. }
  163.  
  164. const char* sockinetbuf::peerhost() const
  165. {
  166.     sockinetaddr sin = peeraddr();
  167.     if (sin.family() != af_inet) return "";
  168.     return sin.gethostname();
  169. }
  170.  
  171. void sockinetbuf::bind (sockAddr& sa)
  172. {
  173.     sockbuf::bind (sa);
  174. }
  175.  
  176. void sockinetbuf::bind ()
  177. {
  178.     sockinetaddr sa;
  179.     bind (sa);
  180. }
  181.  
  182. void sockinetbuf::bind (unsigned long addr, int port_no)
  183.      // address and portno are in host byte order
  184. {
  185.     sockinetaddr sa (addr, port_no);
  186.     bind (sa);
  187. }
  188.  
  189. void sockinetbuf::bind (const char* host_name, int port_no)
  190. {
  191.     sockinetaddr sa (host_name, port_no);
  192.     bind (sa);
  193. }
  194.  
  195. void sockinetbuf::bind (unsigned long addr,
  196.             const char* service_name,
  197.             const char* protocol_name)
  198. {
  199.     sockinetaddr sa (addr, service_name, protocol_name);
  200.     bind (sa);
  201. }
  202.  
  203. void sockinetbuf::bind (const char* host_name,
  204.             const char* service_name,
  205.             const char* protocol_name)
  206. {
  207.     sockinetaddr sa (host_name, service_name, protocol_name);
  208.     bind (sa);
  209. }
  210.  
  211. void sockinetbuf::connect (sockAddr& sa)
  212. {
  213.     sockbuf::connect (sa);
  214. }
  215.  
  216. void sockinetbuf::connect (unsigned long addr, int port_no)
  217.      // address and portno are in host byte order
  218. {
  219.     sockinetaddr sa (addr, port_no);
  220.     connect (sa);
  221. }
  222.  
  223. void sockinetbuf::connect (const char* host_name, int port_no)
  224. {
  225.     sockinetaddr sa (host_name, port_no);
  226.     connect (sa);
  227. }
  228.  
  229. void sockinetbuf::connect (unsigned long addr,
  230.             const char* service_name,
  231.             const char* protocol_name)
  232. {
  233.     sockinetaddr sa (addr, service_name, protocol_name);
  234.     connect (sa);
  235. }
  236.  
  237. void sockinetbuf::connect (const char* host_name,
  238.             const char* service_name,
  239.             const char* protocol_name)
  240. {
  241.     sockinetaddr sa (host_name, service_name, protocol_name);
  242.     connect (sa);
  243. }
  244.  
  245. isockinet::isockinet (sockbuf::type ty, int proto)
  246. : ios (new sockinetbuf (ty, proto))
  247. {
  248.     unsetf (ios::dont_close); // ios::~ios deletes rdbuf()
  249. }
  250.  
  251. isockinet::isockinet (const sockbuf& sb)
  252. : ios (new sockinetbuf (sb))
  253. {
  254.     unsetf (ios::dont_close); // ios::~ios deletes rdbuf()
  255. }
  256.  
  257. osockinet::osockinet (sockbuf::type ty, int proto)
  258. : ios (new sockinetbuf (ty, proto))
  259. {
  260.     unsetf (ios::dont_close); // ios::~ios deletes rdbuf()
  261. }
  262.  
  263. osockinet::osockinet (const sockbuf& sb)
  264. : ios (new sockinetbuf (sb))
  265. {
  266.     unsetf (ios::dont_close); // ios::~ios deletes rdbuf()
  267. }
  268.  
  269. iosockinet::iosockinet (sockbuf::type ty, int proto)
  270. : ios (new sockinetbuf (ty, proto))
  271. {
  272.     unsetf (ios::dont_close); // ios::~ios deletes rdbuf()
  273. }
  274.  
  275. iosockinet::iosockinet (const sockbuf& sb)
  276. : ios (new sockinetbuf (sb))
  277. {
  278.     unsetf (ios::dont_close); // ios::~ios deletes rdbuf()
  279. }
  280.  
  281. extern "C" int h_errno;
  282. void herror(const char* em)
  283. {
  284.     char* errmsg[] = {
  285.         ": No error\n",
  286.         ": Host not found\n",
  287.         ": Try again\n",
  288.         ": No recovery\n",        
  289.         ": No address\n"
  290.         ": Unknown error\n"
  291.         };
  292.     if (h_errno > 5) h_errno = 5;
  293.     cerr << em << errmsg[h_errno];
  294. }
  295.